package com.artevivo.entidades;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "MATRICULAS")
public class Matricula {

    // PrimaryKey
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "IdMatricula", unique = true, nullable = false)
    private Long idMatricula;

    // Atributos
    /** The nombre. */
    @Column(name = "FechaAlta", unique = false, nullable = false)
    private Date fechaAlta;

    @ManyToOne
    @JoinColumn(name = "idCliente", referencedColumnName = "IdCliente")
    private Cliente cliente;

    @ManyToOne
    @JoinColumn(name = "Anyo", referencedColumnName = "IdAnyo")
    private Anyo anyo;

    @OneToMany(mappedBy = "matricula")
    private Set<CursoPorMatricula> especialidadesPorMatriculas = new HashSet<CursoPorMatricula>();

    @OneToMany(mappedBy = "matricula")
    private Set<Baja> bajas = new HashSet<Baja>();

    @OneToMany(mappedBy = "matricula")
    private Set<Enero> enero = new HashSet<Enero>();

    @OneToMany(mappedBy = "matricula")
    private Set<Febrero> febrero = new HashSet<Febrero>();

    @OneToMany(mappedBy = "matricula")
    private Set<Marzo> marzo = new HashSet<Marzo>();

    @OneToMany(mappedBy = "matricula")
    private Set<Abril> abril = new HashSet<Abril>();

    @OneToMany(mappedBy = "matricula")
    private Set<Mayo> mayo = new HashSet<Mayo>();

    @OneToMany(mappedBy = "matricula")
    private Set<Junio> junio = new HashSet<Junio>();

    @OneToMany(mappedBy = "matricula")
    private Set<Julio> julio = new HashSet<Julio>();

    @OneToMany(mappedBy = "matricula")
    private Set<Agosto> agosto = new HashSet<Agosto>();

    @OneToMany(mappedBy = "matricula")
    private Set<Septiembre> septiembre = new HashSet<Septiembre>();

    @OneToMany(mappedBy = "matricula")
    private Set<Octubre> octubre = new HashSet<Octubre>();

    @OneToMany(mappedBy = "matricula")
    private Set<Noviembre> noviembre = new HashSet<Noviembre>();

    @OneToMany(mappedBy = "matricula")
    private Set<Diciembre> diciembre = new HashSet<Diciembre>();

    public Matricula() {
        super();
    }

    public Matricula(Date fechaAlta, Cliente cliente, Anyo anyo) {
        super();
        this.fechaAlta = fechaAlta;
        this.cliente = cliente;
        this.anyo = anyo;
    }

    public Long getIdMatricula() {
        return idMatricula;
    }

    public void setIdMatricula(Long idMatricula) {
        this.idMatricula = idMatricula;
    }

    public Date getFechaAlta() {
        return fechaAlta;
    }

    public void setFechaAlta(Date fechaAlta) {
        this.fechaAlta = fechaAlta;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Set<CursoPorMatricula> getEspecialidadesPorMatriculas() {
        return especialidadesPorMatriculas;
    }

    public void setEspecialidadesPorMatriculas(Set<CursoPorMatricula> especialidadesPorMatriculas) {
        this.especialidadesPorMatriculas = especialidadesPorMatriculas;
    }

    public Set<Baja> getBajas() {
        return bajas;
    }

    public void setBajas(Set<Baja> bajas) {
        this.bajas = bajas;
    }

    public Set<Enero> getEnero() {
        return enero;
    }

    public void setEnero(Set<Enero> enero) {
        this.enero = enero;
    }

    public Set<Febrero> getFebrero() {
        return febrero;
    }

    public void setFebrero(Set<Febrero> febrero) {
        this.febrero = febrero;
    }

    public Set<Marzo> getMarzo() {
        return marzo;
    }

    public void setMarzo(Set<Marzo> marzo) {
        this.marzo = marzo;
    }

    public Set<Abril> getAbril() {
        return abril;
    }

    public void setAbril(Set<Abril> abril) {
        this.abril = abril;
    }

    public Set<Mayo> getMayo() {
        return mayo;
    }

    public void setMayo(Set<Mayo> mayo) {
        this.mayo = mayo;
    }

    public Set<Junio> getJunio() {
        return junio;
    }

    public void setJunio(Set<Junio> junio) {
        this.junio = junio;
    }

    public Set<Julio> getJulio() {
        return julio;
    }

    public void setJulio(Set<Julio> julio) {
        this.julio = julio;
    }

    public Set<Agosto> getAgosto() {
        return agosto;
    }

    public void setAgosto(Set<Agosto> agosto) {
        this.agosto = agosto;
    }

    public Set<Septiembre> getSeptiembre() {
        return septiembre;
    }

    public void setSeptiembre(Set<Septiembre> septiembre) {
        this.septiembre = septiembre;
    }

    public Set<Octubre> getOctubre() {
        return octubre;
    }

    public void setOctubre(Set<Octubre> octubre) {
        this.octubre = octubre;
    }

    public Set<Noviembre> getNoviembre() {
        return noviembre;
    }

    public void setNoviembre(Set<Noviembre> noviembre) {
        this.noviembre = noviembre;
    }

    public Set<Diciembre> getDiciembre() {
        return diciembre;
    }

    public void setDiciembre(Set<Diciembre> diciembre) {
        this.diciembre = diciembre;
    }

    public Anyo getAnyo() {
        return anyo;
    }

    public void setAnyo(Anyo anyo) {
        this.anyo = anyo;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((anyo == null) ? 0 : anyo.hashCode());
        result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
        result = prime * result + ((fechaAlta == null) ? 0 : fechaAlta.hashCode());
        result = prime * result + ((idMatricula == null) ? 0 : idMatricula.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Matricula other = (Matricula) obj;
        if (anyo == null) {
            if (other.anyo != null) {
                return false;
            }
        } else if (!anyo.equals(other.anyo)) {
            return false;
        }
        if (cliente == null) {
            if (other.cliente != null) {
                return false;
            }
        } else if (!cliente.equals(other.cliente)) {
            return false;
        }
        if (fechaAlta == null) {
            if (other.fechaAlta != null) {
                return false;
            }
        } else if (!fechaAlta.equals(other.fechaAlta)) {
            return false;
        }
        if (idMatricula == null) {
            if (other.idMatricula != null) {
                return false;
            }
        } else if (!idMatricula.equals(other.idMatricula)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Matricula [idMatricula=" + idMatricula + ", fechaAlta=" + fechaAlta + ", cliente=" + cliente + ", anyo=" + anyo + "]";
    }

}
